跳到主要内容

Promise 方法

🚀 Promise 的含义:Promise 是异步编程的一种解决方案。

Promise 对象是一个构造函数。对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。

特点

  • new Promise 新建后就会立即执行。
  • 无法取消 Promise。
  • 不设置回调函数,内部抛出的错误不会反应到外部。

基本用法

const promise = new Promise(function (resolve, reject) {});

then

promise.then(
function (value) {
// success
},
function (error) {
// failure
}
);

catch

一般来说,不使用 then()方法的第二个参数。,总是使用 catch 方法。抛出的错误不会传递到外层代码,“Promise 会吃掉错误”。

promise
.then(function (data) {
//cb
// success
})
.catch(function (err) {
// error
});

finally

不管 Promise 对象最后状态如何,都会执行的操作。

promise.then(result => {})
.catch(error => {})
.finally(() => {});

源码实现原理。

Promise.prototype.finally = function (callback) {
let P = this.constructor;
return this.then(
(value) => P.resolve(callback()).then(() => value),
(reason) =>
P.resolve(callback()).then(() => {
throw reason;
})
);
};

all

等待全部请求都成功,则成功,否则失败 没有自己的 catch 方法,就会调用 Promise.all()的 catch 方法。

const resolved = Promise.resolve(42);
const rejected = new Promise(function (resolve, reject) {
setTimeout(() => {
console.log("请求是否停止");
reject(-1);
}, 3000);
});

const promise = Promise.all([resolved, rejected]);

promise.then(function (results) {
console.log(results);
}).catch(error => {})

race

一旦有结果,返回当前状态。不影响其他请求

const resolved = Promise.resolve(42);
const rejected = new Promise(function (resolve, reject) {
setTimeout(() => {
console.log("请求是否停止");
reject(-1);
}, 3000);
});

const promise = Promise.race([resolved, rejected]);

promise.then(function (results) {
console.log(results);
});

allSettled

异步操作是否都结束,返回状态组

const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);
const promise = Promise.allSettled([resolved, rejected]);

promise.then(function (results) {
console.log(results);
});
// [
// { status: 'fulfilled', value: 42 },
// { status: 'rejected', reason: -1 }
// ]

any

有一个成功,返回成功,都失败,返回失败

var resolved = Promise.resolve(42);
var rejected = Promise.reject(-1);
var alsoRejected = Promise.reject(Infinity);

Promise.any([resolved, rejected, alsoRejected]).then(function (result) {
console.log(result); // 42
});

Promise.any([rejected, alsoRejected]).catch(function (results) {
console.log(results instanceof AggregateError); // true
console.log(results.errors); // [-1, Infinity]
});

resolve

转为 Promise 对象,然后就立即执行 thenable 对象的 then() 方法。

Promise.resolve("foo");
// 等价于
new Promise((resolve) => resolve("foo"));

reject

返回一个新的 Promise 实例,状态为 rejected,回调函数会立即执行。

const p = Promise.reject("出错了");
// 等同于
const p = new Promise((resolve, reject) => reject("出错了"));

try

const f = () => console.log("now");
(() => new Promise((resolve) => resolve(f())))();
console.log("next");
// now
// next

// 提供Promise.try方法替代上面的写法。

const f = () => console.log("now");
Promise.try(f);
console.log("next");
// now
// next

应用

const preloadImage = function (path) {
return new Promise(function (resolve, reject) {
const image = new Image();
image.onload = resolve;
image.onerror = reject;
image.src = path;
});
};